package com.otod.pm.prj.web;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.google.common.collect.Lists;
import com.otod.base.exception.AppException;
import com.otod.base.json.JsonSuccess;
import com.otod.commons.constants.CommonConstant;
import com.otod.commons.entity.Page;
import com.otod.commons.utils.StringUtils;
import com.otod.commons.web.BaseController;
import com.otod.pm.prj.bo.DetailCfgFiledBo;
import com.otod.pm.prj.service.DetailService;
import com.otod.pm.prj.vo.DetailCfgVo;
import com.otod.pm.prj.vo.DetailVo;
import com.otod.sys.code.service.ICodeService;


/**
 * 项目详细信息管理
 * 
 * @author longjinwei
 */
@Controller
@RequestMapping("pm/detail")
public class DetailController extends BaseController {
	
	private static Logger logger = LoggerFactory.getLogger(DetailController.class);
	
	@Autowired
	private DetailService detailService;
	
	@Autowired
	private ICodeService codeService;
	//定义给种类型常量
	
	//文本类型
	private static final String textType="30020001";
	
	//日期类型
	private static final String dateType="30020002";
	
	//整数类型
	private static final String integerType="30020003";
	
	//小数类型
	private static final String decimalsType="30020004";
	
	//【30030001】普通【30030002】下拉单选【30030003】列表单选 
	
	//普通文本
	private static final String  commonText="30030001";
	
	//下拉单选
	private static final String select_DownText="30030002";
	
	//列表单选
	private static final String radioText ="30030003";
	
	/**
	 * 分页查询产品类型表 主要用于表 pm_t_detail_cfg
	 * 
	 * @param request
	 * @return
	 */
	@RequestMapping(value = "queryPage", method = RequestMethod.GET)
	@ResponseBody
	public Page queryPage(HttpServletRequest request) {
		// 参数转换
		Map params = super.getParamMapFromRequest(request);
		
		Page page = new Page(request);
		
		return detailService.queryForList(page, params);
	}

	/**
	 * 保存产品类型
	 * 
	 * @param vo
	 * @return
	 * @throws AppException 
	 */
	@RequestMapping(value = "saveCfg", method = RequestMethod.POST)
	@ResponseBody
	public String saveCfg(String prjType, String filedString, HttpServletRequest request) throws AppException{		
		//用于选择文本的时候判断
		int number = 0;
		//实例化
		DetailController detailController = null;
		DetailCfgVo deta = null;
		logger.debug("类型"+prjType);
		logger.debug("选择下拉"+filedString);
		
		
		// 查询出最大的版本号码 新增的时候要用到
		int version = detailService.getMaxVersion(prjType);
		
		if(StringUtils.isEmpty(filedString)){
			
			throw new AppException("请选择新增列名");
			/*//如果一个都没有选中点击保存 就要先判断前面是否有过添加字段 如果前面没有新增字段则拦截 主要是这个类型在前期没有做过任何的操作
			if(version==0){
				throw new AppException("请选择新增列名");
			}
			//前面把所有新增字段全部去掉  查询新增字段为空则拦截  最新状态 在detailCfg-mapper.xml中配置 只需要传个类型
			List<DetailCfgVo> li = detailService.selectDetailPrjType(prjType);
			if(li==null){
				throw new AppException("请选择新增列名");
			}
			//把所有新增字段去掉
			deta = new DetailCfgVo();
			//主键 随机数生成
			deta.setUuid(detailService.addDetailCfg());
			// 设置产品类型
			deta.setPrjType(prjType);
			// 添加版本号
			deta.setVersion(version + 1);
			// 是否是可用
			// CommonConstant.COMMON_YES 是
			// CommonConstant.COMMON_YES 否
			deta.setStatus(CommonConstant.COMMON_YES);
			//修改状态
			detailService.updateStatus(prjType, CommonConstant.COMMON_NO,version);
			//添加
			detailService.addDetailCfgNo(deta);*/
			
		}else{
			String[] splitFiled = filedString.split(";");
			List<DetailCfgVo> list = new ArrayList<DetailCfgVo>();
			
			Set<String> set = new HashSet<>();	
			
			detailController = new DetailController();
			
			//把有字段名字的 名字添加到set里面
			for (int i = 0; i < splitFiled.length; i++) {
				
				if(StringUtils.isNotEmpty(splitFiled[i])){
					set.add(splitFiled[i]);
				}
				i = i+2;	
			}
			for (int i = 0; i < splitFiled.length; i++) {
				deta = new DetailCfgVo();
				number=0;
				// 主键 随机数生成
				deta.setUuid(detailService.addDetailCfg());

				String fileType= splitFiled[++i];
				--i;
				// 设置产品类型
				deta.setPrjType(prjType);
				// 添加版本号
				deta.setVersion(version + 1);				
				// 是否是可用
				// CommonConstant.COMMON_YES 是
				// CommonConstant.COMMON_YES 否
				deta.setStatus(CommonConstant.COMMON_YES);
				String filedName = splitFiled[i];
				//字段名字如果为空
				if(StringUtils.isEmpty(splitFiled[i])){
					//得到字段类型
					//如果字段类型为空则要查询出没有使用的字段 由于是新增的字段是 一串数字
					String filedType = splitFiled[++i];
					--i;
					//设置字段名字
					String name = "";
					//时间类型		
					if(filedType==dateType||dateType.equals(filedType)){	
						++number;
						name = detailController.getFiledName(set, "date", 1, 4);
						set.add(name);
						// 设置产品字段类型 
						deta.setFieldType("date");
						//设置关联处理
					//金额类型 小数
					}else if(filedType==decimalsType||decimalsType.equals(filedType)){
						++number;
						name=detailController.getFiledName(set, "dec", 1, 4);
						
						set.add(name);
						
						// 设置产品字段类型 
						
						deta.setFieldType("decimal");
						
						
					//整数
					}else if(filedType==integerType||integerType.equals(filedType)){
						++number;
						name=detailController.getFiledName(set, "long", 1, 4);
						
						set.add(name);
						// 设置产品字段类型 
					
						deta.setFieldType("bigInt");
						
					//文本 处理 if(filedType==textType||textType.equals(filedType))
					}else {
						++number;
						
						//主要用于 如果是文本 和下拉列表 和 列表单选 
						int fieldNumber = 0;
						name=detailController.getFiledName(set, "var", 1, 8);
						
						set.add(name);
						
						String changeJson= filedType;
						
						//截取
						String[] splictJson = changeJson.split(",");
						//得到前台的类型
						String filedTypeNumber = splictJson[0].substring(splictJson[0].indexOf(":")+1);
						// 设置产品字段类型 
						
						
						//普通文本
						if(filedTypeNumber==commonText||commonText.equals(filedTypeNumber)){
							++fieldNumber;
							
						}else if(filedTypeNumber==select_DownText||select_DownText.equals(filedTypeNumber)){
							deta.setFieldType("select");
							
							
							
						}else if(filedTypeNumber==radioText||radioText.equals(filedTypeNumber)){
							deta.setFieldType("radio");
							
						}
						
						if(fieldNumber==1){
							deta.setFieldType("varchar");
							
						}else{
							//把数据转成json格式存入数据库
							String fieldRela = "{\""+splictJson[0].substring(0,splictJson[0].indexOf(":"))+"\":\""+splictJson[0].substring(splictJson[0].indexOf(":")+1)+"\",\""+splictJson[1].substring(0,splictJson[1].indexOf(":"))+"\":\""+splictJson[1].substring(splictJson[1].indexOf(":")+1)+"\"}";
							
							deta.setFieldRela(fieldRela);
							
						}
						
					}
					
					deta.setFieldName(name);
					
				}else{
					
					deta.setFieldName(splitFiled[i]);
					
					if(fileType=="select"||"select".equals(fileType)){
						//设置关联处理
						//查出上一次相关的 数据
						
						deta.setFieldRela(detailService.queryDetailCfgS(prjType, splitFiled[i], version).getFieldRela());
					}else if(fileType=="radio"||"radio".equals(fileType)){
						
						deta.setFieldRela(detailService.queryDetailCfgS(prjType, splitFiled[i], version).getFieldRela());
						
					}
					
				}
				
				if(number!=0){
					++i;
				}else{
					// 字段类型
					deta.setFieldType(splitFiled[++i]);
				}
				// 字段注释
				deta.setFieldcommonts(splitFiled[++i]);
				list.add(deta);
			}
			// 如果version是0就相当于新增 表中没有此类型的数据   
			if (version == 0) {
				// 添加
				detailService.addDetailCfg(list);
			//如果 version大于0就相当于修改并且修改前面的状态为不可用
			} else {
				//表中有这个类型需要先修改状态 首先要查出主键
				detailService.updateStatus(prjType, CommonConstant.COMMON_NO,version);
				// 添加
				detailService.addDetailCfg(list);
			}
		}
		return JsonSuccess.factory("保存类型成功");
	}
	/**
	 * 
	 * 查询最新的产品类型 字段
	 * 
	 * @param request
	 * @return
	 */
	@RequestMapping(value = "selectPrjtype", method = RequestMethod.GET)
	@ResponseBody
	public List<DetailCfgVo> selectPrjtype(String prjType,
			HttpServletRequest request) {
		
		// 查询
		List<DetailCfgVo> list = new ArrayList<DetailCfgVo>();
		list = detailService.selectDetailPrjType(request.getParameter("prj_type"));
		return list;
	}
	
	
	
	/**
	 * 查询产品类型 字段 和最大
	 * prjType:prjType,status:20000001
	 * @param request
	 * @return
	 */
	@RequestMapping(value = "queryPrjtype", method = RequestMethod.GET)
	@ResponseBody
	public List<DetailCfgFiledBo> queryPrjtype(String prjType,String uuid,HttpServletRequest request) throws AppException {
		//通过uuid 查询出来 pm_t_detail表中的版本号码 version
		
		List<DetailCfgVo> list = Lists.newArrayList();
		if(StringUtils.isNotEmpty(uuid)){
			logger.debug("uuid is {}",uuid );
			Map<String, Object> param = new HashMap<String,Object>();
			param.put("prjId", uuid);
			DetailVo detailVo = detailService.selectDetailPrjId(param);
			// 查询
			list = detailService.selectDetailPrjTypeOld(prjType, detailVo.getCfgVersion());
		}else{
			// 新增加项目
			list = detailService.selectDetailPrjType(prjType);
		}
		return detailService.detailCfgListVo2Bo(list);
	}

	/*********************** 主要针对表 pm_t_detail **********************/

	/**
	 * 分页查询产品基本信息 表名字是 pm_t_detail
	 * 
	 * @param request
	 * @return
	 */
	@RequestMapping(value = "queryDetailPage", method = RequestMethod.GET)
	@ResponseBody
	public Page queryDetailPage(HttpServletRequest request) {
		// 参数转换
		Map params = super.getParamMapFromRequest(request);
		Page page = new Page(request);
		return detailService.queryForListDetail(page, params);
	}

	/**
	 * 通过prjType 和状态 status 查询 pm_t_detail相关的字段
	 * @param request
	 * @return
	 */
	@RequestMapping(value = "queryDetailCfg", method = RequestMethod.GET)
	@ResponseBody
	public List<DetailVo>  queryDetailCfg(String prjType,String status ,HttpServletRequest request) {
		List<DetailVo> detailVos = detailService.queryDetail(prjType, status);
		for(DetailVo detailVo : detailVos){
		//	if(StringUtils.equals(detailVo.get, cs2))
		}
		return detailVos;
		
	}
	/**
	 * 通过uuid 和 版本号cfgversion 查询数据  表是  detail
	 * @param vo
	 * @param request
	 * @return
	 * @throws AppException 
	 */
	@RequestMapping(value = "selectDetail", method = RequestMethod.GET)
	@ResponseBody
	public DetailVo selectDetail(String prjId,int cfgVersion){
		DetailVo vo=detailService.selectDetail(prjId, cfgVersion);
		if(vo == null){
			return new DetailVo();
		}
		return vo;
	}
	/**
	 * 添加数据 到 detail表中
	 * 
	 * @param request
	 * @return
	 */
	/*
	@RequestMapping(value = "saveDetail", method = RequestMethod.POST)
	@ResponseBody
	public String saveDetail(DetailVo vo, HttpServletRequest request)
			 {
	
		int version=0;
		try {
			version = Integer.getInteger(request.getParameter("versionOne"));
		} catch (Exception e) {
			e.printStackTrace();
			// TODO: handle exception
		}
		vo.setPrjId(request.getParameter("prj_id"));
		vo.setCfgVersion(version + 1);
		vo.setUuid(detailService.addDetailCfg());
		detailService.saveDetail(vo);

		return JsonSuccess.factory("保存类型成功");
	}
	*/
	
	
	//生成字段名字
	
	
	
	/*****************************************************************************/
	
	
	
	
	
	/**********************************基础方法使用**********************************************/
	/**
	 * 
	 * @param exitisFiledNameSet
	 * @param filedType
	 * @param index
	 * @param maxIndex
	 * @return
	 * @throws AppException 
	 */
	public String getFiledName(Set<String> existsFiledNameSet,String filedType,int index,int maxIndex) throws AppException{
		
		String filedName = filedType+"Clmn"+index;
		if(existsFiledNameSet.contains(filedName)){
			++index;
			if(index >maxIndex ){
				throw new AppException(filedType+"类型已经使用完 请联系开发人员");
			}
			return getFiledName(existsFiledNameSet, filedType, index,maxIndex);
		}else{
			return filedName;
		}
		
	}
	
	//
	
	
	
	
	/*********************************************************************************/
}
